home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
basic
/
pbc_bas.exe
/
ARCHIVES.BAS
< prev
next >
Wrap
BASIC Source File
|
1993-01-09
|
10KB
|
306 lines
' +----------------------------------------------------------------------+
' | |
' | PBClone Copyright (c) 1990-1993 Thomas G. Hanlin III |
' | |
' +----------------------------------------------------------------------+
DECLARE FUNCTION AscM% (St$, BYVAL Posn%)
DECLARE FUNCTION Exist2% (FileName$)
DECLARE SUB FGetLoc (BYVAL FileHandle%, Posn&)
DECLARE SUB FindNextA (ErrCode%)
DECLARE SUB FOpen1 (FileName$, BYVAL ReadWrite%, BYVAL Sharing%, FileHandle%, ErrCode%)
DECLARE SUB FSetLoc (BYVAL FileHandle%, Posn&)
DECLARE SUB GetNameA (FileName$, FileNameLen%)
DECLARE SUB MatchFile (PatternName$, FileName$, IsMatch%)
DECLARE SUB ParseFSpec (FileSpec$, Drive$, DLen%, Subdir$, SLen%, File$, FLen%)
DECLARE SUB SFRead (BYVAL FileHandle%, St$, BytesRead%, ErrCode%)
DECLARE SUB GetArc00 (Handle%, ArcType%, File$, Header$)
DECLARE SUB SetArc00 (BYVAL Handle%, BYVAL ArcType%, File$, Header$)
SUB FindFirstA (Archive$, FileName$, ErrCode%)
ErrCode% = 0
File$ = LEFT$(FileName$, 12)
Arc$ = UCASE$(Archive$)
IF INSTR(Arc$, ".") = 0 THEN
IF Exist2%(Arc$ + ".ZIP") THEN
Arc$ = Arc$ + ".ZIP"
ELSEIF Exist2%(Arc$ + ".LZH") THEN
Arc$ = Arc$ + ".LZH"
ELSEIF Exist2%(Arc$ + ".ARC") THEN
Arc$ = Arc$ + ".ARC"
ELSEIF Exist2%(Arc$ + ".PAK") THEN
Arc$ = Arc$ + ".PAK"
ELSEIF Exist2%(Arc$ + ".ZOO") THEN
Arc$ = Arc$ + ".ZOO"
ELSEIF Exist2%(Arc$ + ".ARJ") THEN
Arc$ = Arc$ + ".ARJ"
ELSEIF Exist2%(Arc$ + ".EXE") THEN
Arc$ = Arc$ + ".EXE"
ELSEIF Exist2%(Arc$ + ".COM") THEN
Arc$ = Arc$ + ".COM"
ELSE
Arc$ = Arc$ + "."
END IF
END IF
SELECT CASE RIGHT$(Arc$, 3)
CASE "ARC", "PAK"
ArcType% = 1
CASE "LZH"
ArcType% = 2
CASE "ZIP"
ArcType% = 3
CASE "ZOO"
ArcType% = 4
CASE "ARJ"
ArcType% = 5
CASE "COM", "EXE"
ArcType% = -1
CASE ELSE
ErrCode% = 9999
END SELECT
Posn& = 1&
IF ErrCode% = 0 THEN FOpen1 Arc$, 0, 2, Handle%, ErrCode%
IF ErrCode% = 0 AND ArcType% = -1 THEN
Header$ = "xx"
SFRead Handle%, Header$, BytesRead%, ErrCode%
IF ErrCode% = 0 THEN IF Header$ <> "MZ" THEN ErrCode% = 9999
IF ErrCode% = 0 THEN ' check for LHARC .EXE
FSetLoc Handle%, 1637&
Header$ = SPACE$(8)
SFRead Handle%, Header$, BytesRead%, ErrCode%
IF ErrCode% = 0 THEN
IF MID$(Header$, 3, 3) = "-lh" THEN
ArcType% = 2
FSetLoc Handle%, 1637&
Posn& = 1637&
END IF
END IF
END IF
IF ErrCode% = 0 AND ArcType% = -1 THEN ' check for PKZIP .EXE
FSetLoc Handle%, 12785&
Header$ = SPACE$(4)
SFRead Handle%, Header$, BytesRead%, ErrCode%
IF ErrCode% = 0 THEN
IF LEFT$(Header$, 4) = "PK" + CHR$(3) + CHR$(4) THEN
ArcType% = 3
FSetLoc Handle%, 12785&
Posn& = 12785&
ELSE
ErrCode% = 9999
END IF
END IF
END IF
END IF
IF ErrCode% = 0 THEN
Header$ = SPACE$(128)
SFRead Handle%, Header$, BytesRead%, ErrCode%
SetArc00 Handle%, ArcType%, File$, Header$
SELECT CASE ArcType%
CASE 1
IF LEFT$(Header$, 1) <> CHR$(26) OR MID$(Header$, 2, 1) = CHR$(0) THEN ErrCode% = 9999
CASE 2
IF MID$(Header$, 3, 1) <> "-" THEN ErrCode% = 9999
CASE 3
IF LEFT$(Header$, 4) <> "PK" + CHR$(3) + CHR$(4) THEN ErrCode% = 9999
CASE 4
IF MID$(Header$, 21, 4) = CHR$(&HDC) + CHR$(&HA7) + CHR$(&HC4) + CHR$(&HFD) THEN
Posn& = CVL(MID$(Header$, &H19, 4)) + 1&
FSetLoc Handle%, Posn&
SFRead Handle%, Header$, BytesRead%, ErrCode%
ELSE
ErrCode% = 9999
END IF
CASE 5
IF LEFT$(Header$, 2) <> CHR$(&H60) + CHR$(&HEA) THEN ErrCode% = 9999
END SELECT
IF ErrCode% < 0 THEN
IF BytesRead% THEN
ErrCode% = 0
Header$ = LEFT$(Header$, BytesRead%)
END IF
END IF
IF ErrCode% = 0 THEN
SetArc00 Handle%, ArcType%, File$, Header$
FSetLoc Handle%, Posn&
CurFile$ = SPACE$(80)
GetNameA CurFile$, FLen%
IF FLen% THEN
FileSpec$ = LEFT$(CurFile$, FLen%)
Drive$ = " "
SubDir$ = SPACE$(64)
CurFile$ = SPACE$(12)
ParseFSpec FileSpec$, Drive$, DLen%, SubDir$, SLen%, CurFile$, FLen%
Drive$ = LEFT$(Drive$, DLen%)
SubDir$ = LEFT$(SubDir$, SLen%)
CurFile$ = LEFT$(CurFile$, FLen%)
MatchFile File$, CurFile$, Found%
ELSE
Found% = 0
END IF
END IF
IF ErrCode% OR NOT Found% THEN
FindNextA ErrCode%
END IF
END IF
END SUB
SUB FindNextA (ErrCode%)
File$ = SPACE$(12)
Header$ = SPACE$(128)
GetArc00 Handle%, ArcType%, File$, Header$
IF Handle% THEN
File$ = RTRIM$(File$)
ELSE
ErrCode% = -1
END IF
DO UNTIL ErrCode% OR Found%
FGetLoc Handle%, Posn&
SELECT CASE ArcType%
CASE 1
IF AscM%(Header$, 2) = 1 THEN
Posn& = Posn& + 25&
ELSE
Posn& = Posn& + 29&
END IF
Posn& = Posn& + CVL(MID$(Header$, 16, 4))
CASE 2
Posn& = Posn& + (ASC(Header$) + 2) + CVL(MID$(Header$, 8, 4))
CASE 3
Posn& = Posn& + 30& + CVI(MID$(Header$, 27, 2))
Posn& = Posn& + CVI(MID$(Header$, 29, 2))
Posn& = Posn& + CVL(MID$(Header$, 19, 4))
CASE 4
Posn& = CVL(MID$(Header$, 7, 4)) + 1&
CASE 5
Posn& = Posn& + CLNG(CVI(MID$(Header$, 3, 2))) + CVL(MID$(Header$, 17, 4)) + 10&
END SELECT
IF ErrCode% = 0 THEN
FSetLoc Handle%, Posn&
Header$ = SPACE$(128)
SFRead Handle%, Header$, BytesRead%, ErrCode%
END IF
IF ErrCode% < 0 THEN
IF BytesRead% THEN
ErrCode% = 0
Header$ = LEFT$(Header$, BytesRead%)
END IF
END IF
SELECT CASE ArcType%
CASE 1: IF LEFT$(Header$, 1) <> CHR$(26) OR MID$(Header$, 2, 1) = CHR$(0) THEN ErrCode% = 9999
CASE 2: IF MID$(Header$, 3, 1) <> "-" OR LEFT$(Header$, 1) = CHR$(0) THEN ErrCode% = 9999
CASE 3: IF LEFT$(Header$, 4) <> "PK" + CHR$(3) + CHR$(4) THEN ErrCode% = 9999
CASE 5: IF LEFT$(Header$, 2) <> CHR$(&H60) + CHR$(&HEA) OR CVI(MID$(Header$, 3, 2)) = 0 THEN ErrCode% = 9999
END SELECT
IF ErrCode% = 0 THEN
SetArc00 Handle%, ArcType%, File$, Header$
FSetLoc Handle%, Posn&
CurFile$ = SPACE$(12)
GetNameA CurFile$, FLen%
IF FLen% THEN
FileSpec$ = LEFT$(CurFile$, FLen%)
Drive$ = " "
SubDir$ = SPACE$(64)
CurFile$ = SPACE$(12)
ParseFSpec FileSpec$, Drive$, DLen%, SubDir$, SLen%, CurFile$, FLen%
Drive$ = LEFT$(Drive$, DLen%)
SubDir$ = LEFT$(SubDir$, SLen%)
CurFile$ = LEFT$(CurFile$, FLen%)
MatchFile File$, CurFile$, Found%
ELSE
Found% = 0
END IF
END IF
LOOP
END SUB
SUB GetNameA (FileName$, FLen%)
File$ = SPACE$(12)
Header$ = SPACE$(128)
GetArc00 Handle%, ArcType%, File$, Header$
SELECT CASE ArcType%
CASE 1
St$ = MID$(Header$, 3, 13)
FLen% = INSTR(St$, CHR$(0))
IF FLen% THEN
FLen% = FLen% - 1
ELSE
FLen% = 12